package three;

import com.rabbitmq.client.CancelCallback;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.DeliverCallback;
import utils.RabbitMQUtils;
import utils.SleepUtils;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.TimeoutException;

public class Consumer02 {
    public static final String QUEUE_NAME = "ACK_QUEUE";

    //接收消息
    public static void main(String[] args) throws IOException, TimeoutException {
        Channel channel = RabbitMQUtils.getChannel();
        System.out.println("c2等待接收消息处理时间较长");

        DeliverCallback deliverCallback =(consumerTag,message)->{
            SleepUtils.sleep(10);
            System.out.println("接收到的消息:"+new String(message.getBody(), StandardCharsets.UTF_8));
            //手动应答
            //第二个参数 false 表示只确认当前指定的 delivery tag 对应的消息。
            //如果该参数为 true，将会确认所有小于等于当前 delivery tag 的消息。在这里，false 表示只确认当前的消息。
            channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
        };
        CancelCallback cancelCallback = (consumerTag -> {
            System.out.println(consumerTag + "消费者取消消费接口回调逻辑");
        });

        //设置不公平分发
        int prefetchCount = 2;
        channel.basicQos(prefetchCount);

        //采用手动应答
        boolean autoAck = false;
        channel.basicConsume(QUEUE_NAME,autoAck,deliverCallback,cancelCallback);
    }
}
